using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._FeatureClass
{
    /// <summary>
    /// <para>Append Annotation Feature Classes</para>
    /// <para>Creates a geodatabase annotation feature class or appends to an existing annotation feature class by combining annotation from multiple input geodatabase annotation feature classes into a single feature class with annotation classes.</para>
    /// <para>通过将多个输入地理数据库注记要素类中的注记合并到具有注记类的单个要素类中，创建地理数据库注记要素类或追加到现有注记要素类。</para>
    /// </summary>    
    [DisplayName("Append Annotation Feature Classes")]
    public class AppendAnnotation : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public AppendAnnotation()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_input_features">
        /// <para>Input features</para>
        /// <para>The input annotation features that will form an annotation class in the output feature class.</para>
        /// <para>将在输出要素类中形成注记类的输入注记要素。</para>
        /// </param>
        /// <param name="_output_featureclass">
        /// <para>Output feature class</para>
        /// <para>A new annotation feature class that will contain an annotation class for each input annotation feature class.</para>
        /// <para>一个新的注记要素类，将包含每个输入注记要素类的注记类。</para>
        /// </param>
        /// <param name="_reference_scale">
        /// <para>Reference scale</para>
        /// <para>The reference scale set in the output feature class. Input features created at a different reference scale will be transformed to match this output reference scale.</para>
        /// <para>输出要素类中的参考比例集。在不同参考比例下创建的输入要素将被转换以匹配此输出参考比例。</para>
        /// </param>
        public AppendAnnotation(List<object> _input_features, object _output_featureclass, double? _reference_scale)
        {
            this._input_features = _input_features;
            this._output_featureclass = _output_featureclass;
            this._reference_scale = _reference_scale;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Append Annotation Feature Classes";

        public override string CallName => "management.AppendAnnotation";

        public override List<string> AcceptEnvironments => ["autoCommit", "scratchWorkspace", "workspace"];

        public override object[] ParameterInfo => [_input_features, _output_featureclass, _reference_scale, _create_single_class.GetGPValue(), _require_symbol_from_table.GetGPValue(), _create_annotation_when_feature_added.GetGPValue(), _update_annotation_when_feature_modified.GetGPValue()];

        /// <summary>
        /// <para>Input features</para>
        /// <para>The input annotation features that will form an annotation class in the output feature class.</para>
        /// <para>将在输出要素类中形成注记类的输入注记要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public List<object> _input_features { get; set; }


        /// <summary>
        /// <para>Output feature class</para>
        /// <para>A new annotation feature class that will contain an annotation class for each input annotation feature class.</para>
        /// <para>一个新的注记要素类，将包含每个输入注记要素类的注记类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output feature class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _output_featureclass { get; set; }


        /// <summary>
        /// <para>Reference scale</para>
        /// <para>The reference scale set in the output feature class. Input features created at a different reference scale will be transformed to match this output reference scale.</para>
        /// <para>输出要素类中的参考比例集。在不同参考比例下创建的输入要素将被转换以匹配此输出参考比例。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Reference scale")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public double? _reference_scale { get; set; }


        /// <summary>
        /// <para>Create a single annotation class</para>
        /// <para><xdoc>
        ///   <para>Specifies how annotation features will be added to the output feature class.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—All annotation features will be aggregated into one annotation class in the output feature class.</bullet_item><para/>
        ///     <bullet_item>Unchecked—Separate annotation classes will be created for each input annotation class in the output feature class unless the classes are named the same and have the same properties. In this case, they will be merged. This is the default.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定如何将注记要素添加到输出要素类中。</para>
        ///   <bulletList>
        ///     <bullet_item>选中 - 所有注记要素将聚合到输出要素类中的一个注记类中。</bullet_item><para/>
        ///     <bullet_item>未选中 - 将为输出要素类中的每个输入注记类创建单独的注记类，除非这些类的名称相同且具有相同的属性。在这种情况下，它们将被合并。这是默认设置。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Create a single annotation class")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _create_single_class_value _create_single_class { get; set; } = _create_single_class_value._false;

        public enum _create_single_class_value
        {
            /// <summary>
            /// <para>ONE_CLASS_ONLY</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("ONE_CLASS_ONLY")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>CREATE_CLASSES</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("CREATE_CLASSES")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Require symbols to be selected from the symbol table</para>
        /// <para><xdoc>
        ///   <para>Specifies how symbols can be selected for newly created annotation features.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—Restricts the creation of annotation features to the list of symbols in the symbol collection of the output feature class.</bullet_item><para/>
        ///     <bullet_item>Unchecked—Allows annotation features to be created with any symbology. This is the default.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定如何为新创建的注记要素选择符号。</para>
        ///   <bulletList>
        ///     <bullet_item>选中 - 将注记要素的创建限制为输出要素类的符号集合中的符号列表。</bullet_item><para/>
        ///     <bullet_item>未选中 - 允许使用任何符号系统创建注记要素。这是默认设置。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Require symbols to be selected from the symbol table")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _require_symbol_from_table_value _require_symbol_from_table { get; set; } = _require_symbol_from_table_value._false;

        public enum _require_symbol_from_table_value
        {
            /// <summary>
            /// <para>REQUIRE_SYMBOL</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("REQUIRE_SYMBOL")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_SYMBOL_REQUIRED</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_SYMBOL_REQUIRED")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Create annotation when new features are added (Feature-linked only)</para>
        /// <para><xdoc>
        ///   <para>This parameter is only available with ArcGIS Desktop Standard and ArcGIS Desktop Advanced licenses.</para>
        ///   <para>Specifies whether feature-linked annotation will be created when a feature is added.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—Feature-linked annotation will be created using the label engine when a linked feature is created. This is the default.</bullet_item><para/>
        ///     <bullet_item>Unchecked—Feature-linked annotation will not be created when a feature is created.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>此参数仅适用于 ArcGIS Desktop Standard 和 ArcGIS Desktop Advanced 许可。</para>
        ///   <para>指定添加要素时是否创建要素链接注释。</para>
        ///   <bulletList>
        ///     <bullet_item>选中 - 创建链接要素时，将使用标注引擎创建要素链接注释。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>未选中 - 创建要素时不会创建与要素相关的注释。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Create annotation when new features are added (Feature-linked only)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _create_annotation_when_feature_added_value _create_annotation_when_feature_added { get; set; } = _create_annotation_when_feature_added_value._true;

        public enum _create_annotation_when_feature_added_value
        {
            /// <summary>
            /// <para>AUTO_CREATE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("AUTO_CREATE")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_AUTO_CREATE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_AUTO_CREATE")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Update annotation when the shape of the linked feature is modified (Feature-linked only)</para>
        /// <para><xdoc>
        ///   <para>This parameter is only available with ArcGIS Desktop Standard and ArcGIS Desktop Advanced licenses.</para>
        ///   <para>Specifies whether feature-linked annotation is updated when a linked feature changes.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—Feature-linked annotation will be updated using the label engine when a linked feature changes. This is the default.</bullet_item><para/>
        ///     <bullet_item>Unchecked—Feature-linked annotation will not be updated when a linked feature changes.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>此参数仅适用于 ArcGIS Desktop Standard 和 ArcGIS Desktop Advanced 许可。</para>
        ///   <para>指定在链接要素发生更改时是否更新要素链接注释。</para>
        ///   <bulletList>
        ///     <bullet_item>选中 - 当链接要素发生更改时，将使用标注引擎更新要素链接注记。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>未选中 - 当链接要素发生更改时，将不会更新要素链接注记。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Update annotation when the shape of the linked feature is modified (Feature-linked only)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _update_annotation_when_feature_modified_value _update_annotation_when_feature_modified { get; set; } = _update_annotation_when_feature_modified_value._true;

        public enum _update_annotation_when_feature_modified_value
        {
            /// <summary>
            /// <para>AUTO_UPDATE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("AUTO_UPDATE")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_AUTO_UPDATE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_AUTO_UPDATE")]
            [GPEnumValue("false")]
            _false,

        }

        public AppendAnnotation SetEnv(int? autoCommit = null, object scratchWorkspace = null, object workspace = null)
        {
            base.SetEnv(autoCommit: autoCommit, scratchWorkspace: scratchWorkspace, workspace: workspace);
            return this;
        }

    }

}